package com.naiterui.ehp.bs.doctor.service;

import com.naiterui.ehp.bp.bo.agent.DoctorDetailBO;
import com.naiterui.ehp.bp.bo.doctor.DoctorBO;
import com.naiterui.ehp.bp.bo.doctor.PcUserBO;
import com.naiterui.ehp.bp.bo.doctor.RecomDoctorBO;
import com.naiterui.ehp.bp.domain.Doctor;
import com.naiterui.ehp.bp.support.exception.BusinessException;
import com.naiterui.ehp.bs.doctor.vo.DoctorAuthVO;
import com.naiterui.ehp.bs.doctor.vo.DoctorInfoExcelVO;
import com.naiterui.ehp.bs.doctor.vo.DoctorMineVO;
import com.naiterui.ehp.bs.doctor.vo.DoctorParaRequestVO;
import com.naiterui.ehp.bs.doctor.vo.DoctorVO;
import com.naiterui.ehp.bs.doctor.vo.SignUserParamVO;
import com.naiterui.ehp.bs.doctor.vo.UserCenterVO;
import com.naiterui.ehp.bs.doctor.vo.inner.DoctorParamVO;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;
import java.util.Set;

public interface IDoctorService {

    /**
     * 用户中心
     * DoctorServiceImpl.getUserCenter()
     *
     * @param doctorId
     * @return
     * @throws BusinessException
     * @Author guoyongxiang
     * @Date 2016年1月13日
     * @since 2.0.0
     */
    UserCenterVO getUserCenter(Long doctorId) throws BusinessException;

    /**
     * <根据医生ID获取医生信息>
     *
     * @param doctorId
     * @return DoctorVO <医生VO>
     * @Throws 异常信息
     * @History 2015-6-20 下午3:24:22 by guoyongxiang
     */
    DoctorVO getDoctor(Long doctorId) throws BusinessException;

    /**
     * <修改医生--添加医生擅长和个人简介删除>
     * <详细描述>
     *
     * @param doctor     医生数据
     * @param verifyCode 验证码
     * @param password   密码
     * @param delType    删除参数类型 1擅长2个人简介
     * @throws BusinessException void <返回值描述>
     * @Throws 异常信息
     * @History 2015年6月25日 下午3:55:30 by chenlin
     * 2015年12月10日 下午3:55:30 by chenlin 修改
     */
    void saveDoctor(DoctorParaRequestVO doctor, String verifyCode, String password, Integer delType) throws BusinessException;

    /**
     * <根据医生ID获取医生认证信息>
     * <详细描述>
     *
     * @param doctorId
     * @return
     * @throws BusinessException Doctor <返回值描述>
     * @Throws 异常信息
     * @History 2015年6月24日 下午7:24:25 by chenlin
     */
    DoctorAuthVO getDoctorAuthByDoctorId(Long doctorId) throws BusinessException;

    /**
     * <获取doctor的基本信息，刚注册的医生信息不全>
     * <详细描述>
     *
     * @param doctorId
     * @return
     * @throws BusinessException Doctor <返回值描述>
     * @Throws 异常信息
     * @History 2015年6月25日 下午11:40:36 by chenlin
     */
    Doctor getDoctorById(Long doctorId);

    /**
     * <获取doctor的基本信息，刚注册的医生信息不全>
     * <详细描述>
     *
     * @param userId
     * @return
     * @throws BusinessException Doctor <返回值描述>
     * @Throws 异常信息
     * @History 2015年6月25日 下午11:32:09 by chenlin
     */
    Doctor findDoctorByUserId(Long userId);

    /**
     * <根据医生电话,查询医生信息>
     *
     * @param phoneNum
     * @return
     * @throws BusinessException Doctor <返回值描述>
     * @Throws 异常信息
     * @History 2015年11月2日 下午6:37:45 by chenlin
     */
    Doctor getDoctorByPhone(String phoneNum);

    /**
     * 医生端2.0,新注册用户、老用户新版本首登，初始化公告信息
     * IDoctorService.getNewDoctorNotice()
     *
     * @param doctorId
     * @param initType
     * @throws Exception
     * @Date 2016年1月12日
     * @since 2.0.0
     */
    void getNewDoctorNotice(Long doctorId, Integer initType) throws Exception;


    /**
     * 医生个人资料(必填资料)提交
     * IDoctorService.saveDoctorBase()
     *
     * @param doctorParaRequestVO 医生参数vo
     * @throws BusinessException
     * @Date 2016年2月27日
     * @since 2.2.0
     */
    void saveDoctorBase(DoctorParaRequestVO doctorParaRequestVO) throws BusinessException;

    /**
     * 获取医生map(id,实体)
     * IDoctorService.getDoctorMap()
     *
     * @param doctorIds
     * @return
     * @Date 2016年3月24日
     * @since 2.2.1
     */
    Map<Long, Doctor> getDoctorMap(Set<Long> doctorIds);

    /**
     * 获取医生的价格区域id
     *
     * @param doctorId
     * @return
     * @Author fanjiandong
     * @Date 2016年5月4日
     * @since 1.0.0
     */
    Integer getDoctorCityIdById(Long doctorId) throws BusinessException;

    /**
     * 获取医生的区域id
     * IDoctorService.getDoctorAreaId()
     *
     * @param doctorId
     * @param doctor
     * @return
     * @throws BusinessException
     * @Author lichaopi
     * @Date 2018年2月26日
     * @since 1.0.0
     */
    Integer getDoctorAreaCityId(Long doctorId, Doctor doctor) throws BusinessException;


    /**
     * 根据医生ID获取医生信息，如果没有查询到医生，或者医生账户被禁用，那么就抛出异常
     *
     * @param doctorId 医生id
     * @return
     * @throws BusinessException 用户不存在和账户状态不正确
     */
    Doctor get(Long doctorId) throws BusinessException;

    /**
     * 更新医生
     *
     * @param doctor 医生
     */
    void update(Doctor doctor);

    /**
     * 内部接口获取医生信息
     *
     * @param doctorId 医生ID
     * @return
     */
    RecomDoctorBO getInnerDoctor(Long doctorId) throws BusinessException;

    /**
     * 更新医生账户状态
     *
     * @param doctorId
     * @param status
     * @param operator
     */
    void updateAccountStatus(Long doctorId, Integer status, String operator);

    /**
     * 更新医生账户类别
     *
     * @param doctorId
     * @param type
     * @param operator
     */
    void updateAccountType(Long doctorId, Integer type, String operator);

    /**
     * 更新医生资料信息
     * 仅可更新未备案医生资料，当医生为未认证状态时，资料齐全自动提交认证申请
     *
     * @param doctorParamVO
     */
    void updateDoctorInfo(DoctorParamVO doctorParamVO, String operator) throws BusinessException;

    /**
     * 手写签章图处理
     *
     * @param doctorId
     * @param sourceImgPath 原图完整绝对路径
     * @return
     */
    String processSealImage(Long doctorId, String sourceImgPath);

    /**
     * CA用户回写CA生成的签章图片
     *
     * @param sealImage
     * @param doctorId
     * @throws BusinessException
     */
    void perfectSealImage(String sealImage, Long doctorId) throws BusinessException;

    /**
     * 获取医生列表
     *
     * @param doctorIds
     * @return
     * @throws BusinessException
     */
    Map<Long, DoctorBO> getDoctorsByIds(List<Long> doctorIds) throws BusinessException;

    PcUserBO getUserInfo(String phone);

    PcUserBO getUserFaceInfo(String phone, String h5SuccessUrl, String h5FailUrl);

    /**
     * 更新医生签章图片
     *
     * @param doctorId
     * @param sealImg
     * @throws BusinessException
     */
    void saveSealImg(Long doctorId, MultipartFile sealImg) throws BusinessException;

    /**
     * 获取医生我的主页信息
     * 医生端优化需求1.1
     * @param doctorId
     * @return
     */
    DoctorMineVO getDoctorMineInfo(Long doctorId) throws BusinessException;

    /**
     * 医生端编辑资料
     * 医生端优化需求1.1
     * @param doctorId
     * @param introduction
     * @param expertise
     */
    void updateMineInfo(Long doctorId, String introduction, String expertise) throws BusinessException ;

    void sendAuditDoctorNotice();

    RecomDoctorBO getRecomDoctorInfo(Long doctorId) throws BusinessException;

    /**
     * 批量保存医生信息和登录信息
     * 
     * @param doctorInfos
     */
    void batchSaveDoctor(List<DoctorInfoExcelVO> doctorInfos) throws BusinessException;

    /**
     * 保存证件号
     * 
     * @param doctorId
     * @param number
     * @param type
     * @return
     * @throws BusinessException
     */
    String saveNumber(Long doctorId, String number, Integer type) throws BusinessException;

    SignUserParamVO getUserByPhone(String phone) throws BusinessException;

    DoctorDetailBO getDoctorDetailById(Long doctorId) throws BusinessException;
}